﻿#pragma once

// 游戏物体类型
typedef enum GameObjectType {
    NOTHING,        // 什么也没有
    WALL,           // 墙
    BACKGROUND,     // 背景
    DESTINATION,    // 箱子的目的地
    BOX,            // 箱子
    MAN             // 小人
} GameObjectType;

// 移动结果
typedef enum MoveResult {
    CANNOT_MOVE,        // 本身不具有移动能力
    NO_MOVE,            // 没有移动
    NORMAL_MOVED,       // 正常移动
    ARRIVED_ON_DEST,    // 移动到目标上
    LEFT_FROM_DEST      // 离开目标
} MoveResult;

typedef struct BaseGameObject BaseGameObject;
typedef void (*BaseGameObjectDelete)(BaseGameObject*);
typedef void (*BaseGameObjectDraw)(BaseGameObject*);
typedef BaseGameObject* (*BaseGameObjectMove)(BaseGameObject*, UINT, MoveResult*);

// 基本游戏物体
struct BaseGameObject {
    void* mChild;           // 子类对象
    HDC mDrawer;            // 绘图者
    HANDLE mImage;          // 图片
    HDC mImageDC;           // 图片保存者
    GameObjectType mType;   // 类型
    int mX;                 // 横向坐标
    int mY;                 // 纵向坐标

    BaseGameObjectDelete deleteSelf;
    BaseGameObjectDraw draw;
    BaseGameObjectMove move;
};

BaseGameObject* New_BaseGameObject(HDC, GameObjectType, int ,int);
void BaseGameObject_Delete(BaseGameObject*);
